#ifndef _NETWOK_APP_H_
#define _NETWOK_APP_H_

#include "network_board.h"
#include "485_protocol.h"

#if _NETWOK_FUNCTION_ENABLE_

// 最大发送次数(默认5，最大不超31)
#define WIRELESS_MAX_NUMBER_OF_SEND                                  (5ul)

// 发送超时                   - 1s
#define WIRELESS_MESSAGE_SENGING_RATED_TIME                          (1000ul)
// 重新查询报文执行状态间隔时间 - 1s
#define WIRELESS_INTERVAL_OF_QUERY_EXECUTE_STATUS                    (1000ul)
// 等待电压稳定时间            - 200ms
#define WIRELESS_WAIT_VOLTAGE_STABILIZATION_TIME                     (200ul)
// 空中唤醒设备保活时间         - 3s
#define WIRELESS_AIR_WAKEUP_TIMEOUT                                  (3000ul)
// 等待命令返回等待时间         - 3s
#define WIRELESS_WAIT_COMMAND_RETURN_TIMEOUT                         (3000ul)

// 缓存事件总数
#define WIRELESS_TOTAL_NUMBER_OF_CACHED_EVENTS                       (20ul)
#define UART_RECEIVE_PRINT 1 
typedef struct
{
   uint16_t CurrentCommand; //ProtocolCmd_t
}HostBitStatus_t;

/**
 * @brief 命令表
 *
 */
typedef enum
{
  NETWORK_SELF_TEST,                        // 自检
  NETWORK_RESET_SYSTEM_STATUS,              // 重置系统状态
  NETWORK_INITIATE_NET_ATTACHMENT,          // 启动网络附着
  NETWORK_FORCE_EXIT_COMMAND_MODE,          // 强制退出命令模式
  NETWORK_OPEN_SPECIFIC_FLOOR,              // 打开指定楼层
  NETWORK_ELEVATOR_IO_BOARD_FIRMWARE_TRANS, // 电梯IO板固件传输
  NETWORK_QUERY_OTA_STATUS,                 // 查询OTA状态
  NETWORK_GET_IO_BOARD_VERSION,             // 获取IO板版本
  NETWORK_OPEN_EMERGENCY_MODE,              // 紧急开门
  NETWORK_QUERY_IO_BOARD_MAC_ADDRESS,       // 查询IO板MAC地址
  NETWORK_SET_BOARD_SELF_TEST_MODE,         // 设置板自测试模式
} NetworkCommandTable_t;

/**
 * @brief 报文收发步骤
 *
 */
typedef enum
{
  WIRELESS_ENTERING_IDLE,              // 进入空闲
  WIRELESS_USER_ACTION_RESPONSE,       // 响应用户操作
  WIRELESS_COMMUNICATIONS_ANOMALY,     // 通讯异常
  WIRELESS_COMMAND_EXECUTE_FAILURE,    // 命令执行失败
  WIRELESS_PREPARATION_FOR_SENDING,    // 发送前的准备
  WIRELESS_MESSAGE_DELIVERY_TIMEOUT,   // 报文发送超时
  WIRELESS_MESSAGE_RESPONSE_COMPLETE,  // 报文响应完毕
  WIRELESS_MESSAGE_RESPONSE_EXCEPTION, // 报文响应异常
} NetworkMessageExecuteStep_t;

/**
 * @brief 状态位
 *
 */
typedef struct
{
  uint8_t TransmitIdent        : 1; // 传输使能标志
  uint8_t MessageBusyIdent     : 1; // 消息繁忙
  uint8_t CommandExecuteResult : 1; // 命令执行结果

  uint8_t NumberOfRetries;                        // 重试次数
  uint8_t NumberOfTimesSent;                      // 发送次数
  NetworkCommandTable_t CurrentCommand;           // 当前命令
  void * Parmameter;                              // 携带参数的指针
  NetworkMessageExecuteStep_t MessageExecuteStep; // 报文响应步骤
  uint16_t SendTimeoutInterval;                   // 发送超时时间(ms)
  uint16_t SettingNumberOfRetries;                   // 配置的发送次数
} NetworkBitStatus_t;

#endif

/**
 * @brief 获取设备繁忙标志
 *
 * @return bool - 设备繁忙标志（true：繁忙 false：空闲）
 */
extern bool NetworkGetBusyEn(void);

/**
 * @brief 启动无线设备设备自检任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool NetworkInitiateSelfTestTask(void);

/**
 * @brief 启动无线设备网络附着任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool NetworkInitiateNetworkAttachmentTask(void);

/**
 * @brief 启动设备重置任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool NetworkInitiateDeviceResetTask(void);

/**
 * @brief 启动退出命令模式任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool NetworkStartExitCommandModeTask(void);

/**
 * @brief 重置网络状态
 *
 */
extern void NetworkResetWorkingStatus(void);

/**
 * @brief 进入掉电模式
 *
 */
extern void NetworkIntoPowerDown(void);

/**
 * @brief 向主机推送数据
 *
 * @param pMessageIn    - 待推送的报文
 * @param SizeOfMessage - 报文数据长度
 * @return bool         - 推送状态（true：成功 false：失败）
 */
extern bool NetworkPushMessageToHost(const uint8_t *pMessageIn, uint16_t SizeOfMessage);

/**
 * @brief 无线设备初始化
 *
 */
extern void NetworkConfiguration(void);

/**
 * @brief  启动打开指定楼层任务 (接口)
 * 
 * @param Parm ElectorData_t 类型
 * @return true 
 * @return false 
 */
extern bool NetworkInitiateOpenSpecificFloorTask(ElectorData_t *Parm);

// /**
//  * @brief  启动电梯IO板固件传输任务 (接口)
//  * 
//  * @param Parm IoBoardFirmwareInfo_t
//  * @return true 
//  * @return false 
//  */
// extern bool NetworkIoBoardGetVersionTask(IoBoardFirmwareInfo_t *Parm);

/**
 * @brief  启动紧急开门任务 (接口)
 * 
 * @param Parm 
 * @return true 
 * @return false 
 */
extern bool NetworkIoBoardOpenEmergencyModeTask(uint8_t *Parm);

/**
 * @brief  启动电梯IO板固件传输任务 (接口)
 * 
 * @param Parm 
 * @return true 
 * @return false 
 */
extern bool ElevatorIoBoradFirmwareTransferTask(IoBoardFirmwareInfo_t *Parm);
/**
 * @brief  启动查询OTA状态任务 (接口)
 * 
 * @param Parm 
 * @return true 
 * @return false 
 */
extern bool ElevatorIoBoradGetOtaStatusTask(uint8_t *Parm);

/**
 * @brief  查询IO板MAC地址任务(接口)
 * 
 * @param Parm 
 * @return true 
 * @return false 
 */
extern bool ElevatorQueryIoBoardsIsExistTask(uint8_t *Parm);

/**
 * @brief  设置板自测试模式任务(接口)
 * 
 * @param Parm 
 * @return true 
 * @return false 
 */
extern bool NetworkSetBoardSelfTestModeTask(uint8_t *Parm);
#endif
